package LeetCodeHot100;

/**
 * 3.无重复的最长子串
 * 给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串 的长度。
 *
 *  思路：采用滑动窗口统计不含重复字符的最长子串。 关键点在于使用一个char数组统计滑动字符的出现频率，然后才能滑动
 *      核心点：1： char[256] int数组， 可以作为字符出现频率统计，下标字符，value出现频率（实质也只统计1次）；
 *             2： 双指针，实现滑动窗口，如果r没有出现重复，则统计当前位置字符频率，r右移++，扩展滑动窗口的右边，
 *            如果r出现重复字符，那么就统计长度，l右移++，当前字符的频率--，缩小滑动窗口的左边；
 *      其实很简单，想清楚，easy。
 */
public class LeetCode03 {
    public int lengthOfLongestSubstring(String s) {
        char[] chars = s.toCharArray();
        int[] freq = new int[256]; //ASCII 码
        int l = 0, r = 0;
        int res = 0;
        while (l < s.length()){
            if(r < s.length() && freq[chars[r]] == 0){ // 没有重复值，r右移
                freq[chars[r]]++;
                r++;
            }else { // 有重复值，l右移
                freq[chars[l]]--;
                l++;
            }
            res = Math.max(res,r-l);
        }
        return res;
    }
}